package com.br.planningrun.activity;

import java.util.ArrayList;
import java.util.HashMap;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.br.planningrun.R;
import com.br.planningrun.entidade.Exercicio;
import com.br.planningrun.entidade.TipoTempo;
import com.br.planningrun.repositorio.RepositorioExercicio;

public class ListaExercicioActivity extends Activity {
	public ListView lista;
	private ArrayList<Exercicio> arrayExercicio;

	private int codigoTreino = -1;
	private int codigoPlano = -1;

	private boolean cronometroRodando = false; 
	private long timestempInicial;   
	private long timestemp;
    private static String tempoAux;
    private static TextView tempo;
    private Exercicio exercicio;
    private int posicaoExercicio;
    
    private Thread t = null;
	
	private RepositorioExercicio repExercicio = null;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {		setTitle("PLANNING RUN");
		super.onCreate(savedInstanceState);
		setContentView(R.layout.listaexercicios);

		repExercicio = new RepositorioExercicio ( getApplicationContext());

		// Recupera informacao passada pela tela anterior
		Bundle b = this.getIntent().getExtras();                
		if (b != null && b.containsKey("codigo")) {
			codigoTreino = b.getInt("codigo");
		}

		if (b != null && b.containsKey("codigoPlano")) {
			codigoPlano = b.getInt("codigoPlano");
		}

		carregarListaExercicio(codigoTreino);
		
		tempo = (TextView) findViewById (R.id.tempo);
		cronometroRodando = false;

		tempoAux =   "00:00:00";
		tempo.setText(tempoAux);

		// Click no botao voltar
		Button btVoltar = (Button) findViewById(R.id.botao_valtarexercicio);
		btVoltar.setOnClickListener(new View.OnClickListener() {
			public void onClick(View arg0) {
				final Handler handler = new Handler() {
					public void handleMessage(Message msg) {
						tempo.setText(tempoAux);
					}
				};
				// Navegacao entre as telas

				cronometroRodando = false;
				
				timestemp = 0;
				pintarTempo(handler, timestemp);
				
				try {
					t.interrupt();
				} catch (Exception e) { }
				t = null;

				Bundle b = new Bundle();
				b.putInt("codigo", codigoPlano);

				Intent i = new Intent(ListaExercicioActivity.this, ListaTreinoActivity.class);
				finish();
				i.putExtras(b);
				startActivity(i);
				finish();
			}
		});
	}
	
	private void carregarListaExercicio(int codigoTreino) {
		// Carregar os Exercicio do usuario
		RepositorioExercicio rep = new RepositorioExercicio(getApplicationContext());
		arrayExercicio = rep.listar(" where treino = " + codigoTreino);

		posicaoExercicio = 0;
		if (arrayExercicio != null && arrayExercicio.size() > 0) {
			exercicio = arrayExercicio.get(0);
		}
		
		// Preenchimento do hashmap para criacao do adapter
		ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();
		HashMap<String, String> map;
		for (Exercicio Exercicio : arrayExercicio) {
			map = new HashMap<String, String>();
			map.put("codigo", String.valueOf(Exercicio.getCodigo()));
			map.put("duracao", String.valueOf(Exercicio.getDuracao()));
			map.put("tipotempo", Exercicio.getTipoTempo().getDescricao());
			map.put("codigotipotempo", String.valueOf(Exercicio.getTipoTempo().getCodigo()));
			map.put("tipoexercicio", Exercicio.getTipoExercicio().getDescricao());
			map.put("siglatipoexercicio", Exercicio.getTipoExercicio().getSigla());
			mylist.add(map);
		}

		// Criacao do adapter com hashmap
		lista = (ListView) findViewById(R.id.listaexercicios);
		lista.setAdapter(new ListaExercicioAdapter(this, mylist, R.layout.linhaexercicios,
				new String[] {"duracao", "tipotempo", "tipoexercicio"}, 
				new int[] {R.id.campo_duracao, R.id.campo_tipotempo, R.id.campo_tipoexercicio}));
		registerForContextMenu(lista);

		// click em um item da lista
		lista.setOnItemClickListener(new OnItemClickListener() {
			public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {

		
			}
		}); 
		
		ImageView play = (ImageView) findViewById(R.id.play);
		play.setOnClickListener(new View.OnClickListener() {
			public void onClick(View arg0) {								
				final Handler handler = new Handler() {
					public void handleMessage(Message msg) {												
						tempo.setText(tempoAux);
					}
				};
				
				final Handler handlerMensagem = new Handler() {
					public void handleMessage(Message msg) {												

						if (exercicio != null ) { 	
							Toast.makeText(ListaExercicioActivity.this, "Iniciando: " + exercicio.getDuracao().longValue() + " "+ exercicio.getTipoTempo().getDescricao() + " de " + exercicio.getTipoExercicio().getDescricao(), Toast.LENGTH_SHORT).show();
						}

						System.out.println("Iniciando: " + exercicio.getDuracao().longValue() + " "+ exercicio.getTipoTempo().getDescricao() + " de " + exercicio.getTipoExercicio().getDescricao());

					}
				};

				if (timestemp == 0) {
					exibirMensagem(handlerMensagem);
				}

				cronometroRodando = true;
				if (t == null) {
					t = new Thread() {
						public void run() {						
							try {

			        		   	long timestempExercicio = 0;
				       			if (exercicio != null && exercicio.getTipoTempo().getCodigo() == TipoTempo.SEGUNDO) {
				       				timestempExercicio = exercicio.getDuracao().longValue();
				       			} else if (exercicio != null && exercicio.getTipoTempo().getCodigo() == TipoTempo.MINITO) {
				       				timestempExercicio = exercicio.getDuracao().longValue() * 60;
				       			} else if (exercicio != null && exercicio.getTipoTempo().getCodigo() == TipoTempo.HORA) {
				       				timestempExercicio = exercicio.getDuracao().longValue() * 60 * 60;
				       			}
				       			
								while(true) {
									if (cronometroRodando) {
										
										if (timestempExercicio > 0 && timestemp >= timestempExercicio) {
				       						if (arrayExercicio.size() > (posicaoExercicio+1)) {
				       							posicaoExercicio = (posicaoExercicio + 1 );
				       							exercicio = arrayExercicio.get(posicaoExercicio);

				       							if (exercicio != null && exercicio.getTipoTempo().getCodigo() == TipoTempo.SEGUNDO) {
				       			       				timestempExercicio = exercicio.getDuracao().longValue();
				       			       			} else if (exercicio != null && exercicio.getTipoTempo().getCodigo() == TipoTempo.MINITO) {
				       			       				timestempExercicio = exercicio.getDuracao().longValue() * 60;
				       			       			} else if (exercicio != null && exercicio.getTipoTempo().getCodigo() == TipoTempo.HORA) {
				       			       				timestempExercicio = exercicio.getDuracao().longValue() * 60 * 60;
				       			       			}
				       						} else {
				       							cronometroRodando = false;
				       						}
			       							timestemp = (0);
			       							pintarTempo(handler, 0);
			       							exibirMensagem(handlerMensagem);
				       					}

										pintarTempo(handler, timestemp);
										timestemp++;
									}   

									Thread.sleep(1000);
								}   
							} catch (InterruptedException ex) {   
								ex.printStackTrace();   
							}
						}					
					};
					t.start();
				}
			}
		});
		
		ImageView stop = (ImageView) findViewById(R.id.stop);
		stop.setOnClickListener(new View.OnClickListener() {
			public void onClick(View arg0) {
				final Handler handler = new Handler() {
					public void handleMessage(Message msg) {												
						tempo.setText(tempoAux);
					}
				};

				cronometroRodando = false;

				posicaoExercicio = 0;
				if (arrayExercicio != null && arrayExercicio.size() > 0) {
					exercicio = arrayExercicio.get(0);
				}
				
				timestemp = 0;
				pintarTempo(handler, timestemp);
				
				try {
					t.interrupt();
				} catch (Exception e) { }
				t = null;
				
				timestemp = 0;
				pintarTempo(handler, timestemp);
			}
		});

		ImageView pause = (ImageView) findViewById(R.id.pause);
		pause.setOnClickListener(new View.OnClickListener() {
			public void onClick(View arg0) {
				final Handler handler = new Handler() {
					public void handleMessage(Message msg) {												
						tempo.setText(tempoAux);
					}
				};

				cronometroRodando = false;
				try {
					t.interrupt();
				} catch (Exception e) { }
				t = null;
				
				pintarTempo(handler, timestemp);
			}
		});
	}
	
	public void exibirMensagem(Handler handler) {
		Message msg = new Message();
		handler.sendMessage(msg);
	}
	
	private void pintarTempo(Handler handler, long timestemp) {
		int hora = (int)(timestemp / (60*60));
		int minuto = (int)((timestemp/60) - (hora * 60));
		int segundo = (int)(timestemp - (minuto * 60) - (hora * 60*60));
		
		if( segundo == 60 ){   
			segundo = 00;   
			minuto = minuto+1;   
		}   

		if( minuto == 60){   
			minuto = 00;   
			hora = hora+1;   
		}   

		tempoAux = completaComZero(hora) + ":" +   
				   completaComZero(minuto) + ":" +   
				   completaComZero(segundo);   

		//tempo.setText(tempoAux);

		Message msg = new Message();					                
		handler.sendMessage(msg);		
		
	}
	
    private String completaComZero(Integer i) {   
        String retorno = null;   
        if( i < 10 ) {   
            retorno = "0"+i;   
        } else {   
            retorno = i.toString();   
        }   
        return retorno;   
    }
}